View Javadoc
1   package edu.jiangxin.apktoolbox.pdf;
2   
3   import org.apache.pdfbox.io.RandomAccessReadBuffer;
4   import org.apache.pdfbox.pdfparser.PDFParser;
5   import org.apache.pdfbox.pdmodel.PDDocument;
6   import org.apache.pdfbox.pdmodel.interactive.action.PDAction;
7   import org.apache.pdfbox.pdmodel.interactive.action.PDActionGoTo;
8   import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDDestination;
9   import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDPageDestination;
10  import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDDocumentOutline;
11  import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem;
12  import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineNode;
13  import org.junit.jupiter.api.Test;
14  
15  import java.io.File;
16  import java.io.FileInputStream;
17  import java.io.IOException;
18  
19  public class PdfOutlineTest {
20      String path = "target/test-classes/pdf/";
21  
22      public void alterOutline(PDOutlineNode pdOutlineNode, String indentation) throws IOException {
23  
24          PDOutlineItem currentPdOutlineItem = pdOutlineNode.getFirstChild();
25          while (currentPdOutlineItem != null) {
26              if (currentPdOutlineItem.getDestination() instanceof PDPageDestination) {
27                  PDPageDestination pdOutlineItemDestination = (PDPageDestination) currentPdOutlineItem.getDestination();
28                  pdOutlineItemDestination.setPageNumber(pdOutlineItemDestination.retrievePageNumber() + 25);
29              }
30              if (currentPdOutlineItem.getAction() instanceof PDActionGoTo) {
31                  PDActionGoTo pdActionGoTo = (PDActionGoTo) currentPdOutlineItem.getAction();
32                  if (pdActionGoTo.getDestination() instanceof PDPageDestination) {
33                      PDPageDestination pd = (PDPageDestination) pdActionGoTo.getDestination();
34                      pd.setPageNumber(pd.retrievePageNumber() + 25);
35                  }
36              }
37              alterOutline(currentPdOutlineItem, indentation + "    ");
38              currentPdOutlineItem = currentPdOutlineItem.getNextSibling();
39          }
40      }
41  
42      public void printOutline(PDOutlineNode pdOutlineNode, String indentation) throws IOException {
43          PDOutlineItem currentPdOutlineItem = pdOutlineNode.getFirstChild();
44          while (currentPdOutlineItem != null) {
45              int pages = 0;
46              StringBuilder extraInfo = new StringBuilder();
47              PDDestination pdDestination = currentPdOutlineItem.getDestination();
48              extraInfo.append(indentation + currentPdOutlineItem.getTitle());
49              if (pdDestination instanceof PDPageDestination) {
50                  PDPageDestination pdOutlineItemDestination = (PDPageDestination) pdDestination;
51                  pages = (pdOutlineItemDestination.retrievePageNumber() + 1);
52                  extraInfo.append(":").append(pdDestination.getClass().getSimpleName()).append(":").append(pages);
53              } else {
54                  PDAction pdAction = currentPdOutlineItem.getAction();
55                  if (pdAction instanceof PDActionGoTo) {
56                      PDActionGoTo pdActionGoTo = (PDActionGoTo) pdAction;
57                      pdDestination = pdActionGoTo.getDestination();
58                      if (pdDestination instanceof PDPageDestination) {
59                          PDPageDestination pd = (PDPageDestination) pdDestination;
60                          pages = (pd.retrievePageNumber() + 1);
61                          extraInfo.append(":PDActionGoTo:").append(pdDestination.getClass().getSimpleName()).append(":").append(pages);
62                      }
63                  }
64              }
65  
66              System.out.println(extraInfo);
67              printOutline(currentPdOutlineItem, indentation + "    ");
68              currentPdOutlineItem = currentPdOutlineItem.getNextSibling();
69          }
70      }
71  
72      @Test
73      public void testPrintOutline() {
74          File file = new File(path, "R常用函数整理.pdf");
75          if (!file.exists()) {
76              System.err.println(" file is not exists ");
77              return;
78          }
79          try (FileInputStream fis = new FileInputStream(file)) {
80              PDFParser parser = new PDFParser(new RandomAccessReadBuffer(fis));
81              try (PDDocument document = parser.parse()) {
82                  PdfOutlineTest pdfOutlineTest = new PdfOutlineTest();
83                  PDDocumentOutline pdDocumentOutline = document.getDocumentCatalog().getDocumentOutline();
84                  if (pdDocumentOutline != null) {
85                      pdfOutlineTest.printOutline(pdDocumentOutline, "");
86                  } else {
87                      System.out.println("This document does not contain any outline");
88                  }
89              }
90          } catch (IOException ex) {
91              System.err.println("IOException");
92          }
93      }
94  
95      @Test
96      public void testAlterOutline() {
97          File file = new File(path, "R常用函数整理.pdf");
98          if (!file.exists()) {
99              System.err.println(" file is not exists ");
100             return;
101         }
102         try (FileInputStream fis = new FileInputStream(file)) {
103             PDFParser parser = new PDFParser(new RandomAccessReadBuffer(fis));
104             try (PDDocument document = parser.parse()) {
105                 PdfOutlineTest pdfOutlineTest = new PdfOutlineTest();
106                 PDDocumentOutline pdDocumentOutline = document.getDocumentCatalog().getDocumentOutline();
107                 if (pdDocumentOutline != null) {
108                     pdfOutlineTest.alterOutline(pdDocumentOutline, "");
109                 } else {
110                     System.out.println("This document does not contain any outline");
111                 }
112                 document.save(new File(path, "R常用函数整理_altered.pdf"));
113             }
114         } catch (IOException ex) {
115             System.err.println("IOException");
116         }
117     }
118 }